package com.takeoff.iot.modbus.common.message.factory;

import com.takeoff.iot.modbus.common.bytes.factory.ModbusBytesFactory;
import com.takeoff.iot.modbus.common.message.ModbusByteArrayMessage;
import com.takeoff.iot.modbus.common.message.ModbusMessage;
import com.takeoff.iot.modbus.common.utils.IntegerToByteUtil;
import com.takeoff.iot.modbus.common.utils.ModbusCrc16Utils;

import org.apache.commons.lang3.ArrayUtils;

/**
 * 类功能说明：指令下发处理工厂<br/>
 * 公司名称：TF（腾飞）开源 <br/>
 * 作者：luorongxi <br/>
 */
public class ModbusOutMessageFactory<E> implements ModbusMessageFactory<E> {

	private ModbusBytesFactory<E> factory;

	public ModbusOutMessageFactory(ModbusBytesFactory<E> factory) {
		this.factory = factory;
	}

	/**
	 * 构建下发消息
	 * @param deviceGroup 目标设备
	 * @param datas 数据 addr + funcCode + beginAddr + registerNum + dataByte
	 * @return
	 */
	@Override
	public ModbusMessage buildMessage(String deviceGroup, E... datas) {
		byte[] bytes = factory.toBytes(datas);
		byte[] msg = new byte[ModbusMessage.ADDR_SIZE + ModbusMessage.FUNCTION_SIZE +ModbusMessage.BEGIN_ADDR_SIZE+ModbusMessage.REGISTER_NUM_SIZE+ModbusMessage.CHECKCODE_SIZE];
		msg[ModbusMessage.ADDR_INDEX] = bytes[ModbusMessage.ADDR_INDEX];
		msg[ModbusMessage.FUNC_INDEX] = bytes[ModbusMessage.FUNC_INDEX];
		msg[ModbusMessage.ADDR_INDEX] = bytes[ModbusMessage.ADDR_INDEX];
//		byte[] lengthBytes = IntegerToByteUtil.intToByteArray(bytes.length, MiiMessage.DATA_SIZE);
//		System.arraycopy(lengthBytes, 0, msg, MiiMessage.DATA_INDEX, lengthBytes.length);
//		System.arraycopy(bytes, 0, msg , MiiMessage.COMMAND_INDEX, bytes.length);
//		byte[] checkData = ArrayUtils.subarray(msg, MiiMessage.DATA_INDEX, msg.length - 3);
//		byte[] checkCodeBytes = ModbusCrc16Utils.getCrcByte(checkData);
//		System.arraycopy(checkCodeBytes, 0, msg , msg.length - 3, checkCodeBytes.length);
//		System.arraycopy(MiiMessage.END_BYTES, 0, msg , msg.length - 1, 1);
		return new ModbusByteArrayMessage(deviceGroup, msg);
	}

}
